#include<iostream>
#include<unistd.h>
#include<signal.h>

using namespace std;

void PrintPending(sigset_t &pending)
{
    for(int i=31;i>=1;i--)
    {//判断指定信号是否在目标集合中
        if(sigismember(&pending,i)) cout<<"1";
        else cout<<"0";
    }
    cout<<endl;
}

void myhandler(int signo)
{
    cout<<"get a signo"<<signo<<endl;
}
int main()
{
    signal(2,myhandler);
    sigset_t oset,bset;//在用户区的栈上开辟空间
    sigemptyset(&oset);
    sigemptyset(&bset);
    sigaddset(&bset,2);//添加二号信号为阻塞
    sigprocmask(SIG_SETMASK,&bset,&oset);

    sigset_t pending;
    int cnt=0;
    while(true)
    {
        int n=sigpending(&pending);//获取未决信号集
        if(n<0) continue;//若获取失败直接跳过当前循环进行下一次循环
        PrintPending(pending);//打印未决信号集
        sleep(1);
        cnt++;
        if(cnt==3)//解除阻塞
        {
            cout<<"unblock 2 signo"<<endl;
            //sigprocmask(SIG_UNBLOCK,&bset,nullptr);
            sigprocmask(SIG_SETMASK, &oset, nullptr);
        }
    }
    return 0;
}

// int main()
// {
//     sigset_t bset, oset;
//     sigemptyset(&bset);
//     sigemptyset(&oset);
//     for(int i=1;i<=31;i++)
//     {//将所有信号都设为屏蔽状态
//         sigaddset(&bset,i);
//     }
//     sigprocmask(SIG_SETMASK,&bset,&oset);
//     sigset_t pending;
//     while(true)
//     {
//         int n=sigpending(&pending);//获取未决状态
//         if(n<0) continue;
//         PrintPending(pending);/打印状态
//         sleep(1);
//     }
//     return 0;
// }